// vue.config.js  配置文件的语法都是CommonJS的写法
'use strict'
// 加载path模块
const path = require('path')
function resolve(dir) {
  return path.join(__dirname, dir)
}

const name = 'Boot Plus Admin' // page title

const port = process.env.port || process.env.npm_config_port || 8321
// vue-cli 的配置项
module.exports = {
  // 构建输出目录
  outputDir: 'dist',
  // assert 目录的构建输出目录，基于 outputDir
  assetsDir: 'static',
  // 主文件输出路径，基于 outputDir
  indexPath: 'index.html',
  // 部署应用的root context path
  publicPath: '/',
  // 是否使用包含运行时编译器的vue版本，即在浏览器端可以编译template
  runtimeCompiler: true,
  // 生产环境中不生成sourcemap文件
  productionSourceMap: false,
  // 第一种 webpack 配置方式。也可以和第二种配置方式一样使用函数返回
  configureWebpack: {
    // provide the app's title in webpack's name field, so that
    // it can be accessed in index.html to inject the correct title.
    name: name,
    resolve: {
      alias: {
        // 定义了一个路径src的别名，在vue文件中导入路径就可以直接以@开始
        '@': resolve('src')
      }
    }
  },
  // 第二种webpack的配置方式：链式配置
  chainWebpack: config => {
    // vue的loader配置。匹配rule指明的文件类型，使用vue-loader处理
    config.module
      .rule('vue')
      .use('vue-loader')
      .loader('vue-loader')
      .tap(options => {
        // 保留空白字符
        options.compilerOptions.preserveWhitespace = true
        return options
      })
      .end()
    config
      // https://webpack.js.org/configuration/devtool/#development
      .when(process.env.NODE_ENV === 'development', config =>
        // 这是一个处理sourcemap的工具
        config.devtool('cheap-source-map')
      )
    config.when(process.env.NODE_ENV !== 'development', config => {
      // 将html整合进js中作为字符串
      config
        .plugin('ScriptExtHtmlWebpackPlugin')
        .after('html')
        .use('script-ext-html-webpack-plugin', [
          {
            // `runtime` must same as runtimeChunk name. default is `runtime`
            inline: /runtime\..*\.js$/
          }
        ])
        .end()
      // 切分js文件，减少请求文件的大小
      config.optimization.splitChunks({
        chunks: 'all',
        cacheGroups: {
          libs: {
            name: 'chunk-libs',
            test: /[\\/]node_modules[\\/]/,
            priority: 10,
            chunks: 'initial' // only package third parties that are initially dependent
          },
          elementUI: {
            name: 'chunk-elementUI', // split elementUI into a single package
            priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
            test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
          },
          commons: {
            name: 'chunk-commons',
            test: resolve('src/components'), // can customize your rules
            minChunks: 3, //  minimum common number
            priority: 5,
            reuseExistingChunk: true
          }
        }
      })
      config.optimization.runtimeChunk('single')
    })
  },
  css: {
    // 每个css预处理自己的一些全局配置项，例如可以全局导入某个css文件。还是看各自文档，一般不需要这个配置
    loaderOptions: {
      css: {
        // 这里的选项会传递给 css-loader
      },
      postcss: {
        // 这里的选项会传递给 postcss-loader
      },
      scss: {}
    }
  },
  pluginOptions: {},
  // 提供开发运行的服务器的一些配置
  devServer: {
    port: port,
    open: true,
    overlay: {
      warnings: false,
      errors: true
    },
    // 代理服务器配置，与后端数据接口对接。
    proxy: {
      // change xxx-api/login => mock/login
      // detail: https://cli.vuejs.org/config/#devserver-proxy
      // 将url转接到mock数据服务器上
      [process.env.VUE_APP_BASE_API]: {
        target: `http://127.0.0.1:${port}/mock`,
        changeOrigin: true,
        // 重写接口的根路径为 "/"
        pathRewrite: {
          ['^' + process.env.VUE_APP_BASE_API]: ''
        }
      }
    },
    after: require('./mock/mock-server.js')
  }
}
